{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/davidfoster/.virtualenvs/gdl/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import importlib\n",
    "import os\n",
    "\n",
    "from keras.layers import Input, Embedding, GRU, GRUCell, Bidirectional, TimeDistributed, Dense, Lambda\n",
    "from keras.models import Model, load_model\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "from keras.optimizers import Adam\n",
    "import keras.backend as K\n",
    "from keras.utils import plot_model\n",
    "\n",
    "import numpy as np\n",
    "import random\n",
    "\n",
    "from utils.write import training_data, test_data, collapse_documents, expand_answers, _read_data, glove, START_TOKEN, END_TOKEN, look_up_token\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# run params\n",
    "SECTION = 'write'\n",
    "RUN_ID = '0001'\n",
    "DATA_NAME = 'qa'\n",
    "RUN_FOLDER = 'run/{}/'.format(SECTION)\n",
    "RUN_FOLDER += '_'.join([RUN_ID, DATA_NAME])\n",
    "\n",
    "if not os.path.exists(RUN_FOLDER):\n",
    "    os.mkdir(RUN_FOLDER)\n",
    "    os.mkdir(os.path.join(RUN_FOLDER, 'viz'))\n",
    "    os.mkdir(os.path.join(RUN_FOLDER, 'images'))\n",
    "    os.mkdir(os.path.join(RUN_FOLDER, 'weights'))\n",
    "\n",
    "mode =  'build' #'load' #"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#### LOAD DATA ####\n",
    "\n",
    "test_data_gen = test_data()\n",
    "batch = next(test_data_gen)\n",
    "batch = collapse_documents(batch)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "VOCAB_SIZE = glove.shape[0]\n",
    "EMBEDDING_DIMENS = glove.shape[1]\n",
    "\n",
    "GRU_UNITS = 100\n",
    "MAX_DOC_SIZE = None\n",
    "MAX_ANSWER_SIZE = None\n",
    "MAX_Q_SIZE = None"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# architecture"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#### TRAINING MODEL ####\n",
    "\n",
    "document_tokens = Input(shape=(MAX_DOC_SIZE,), name=\"document_tokens\")\n",
    "\n",
    "embedding = Embedding(input_dim = VOCAB_SIZE, output_dim = EMBEDDING_DIMENS, weights=[glove], mask_zero = True, name = 'embedding')\n",
    "document_emb = embedding(document_tokens)\n",
    "\n",
    "answer_outputs = Bidirectional(GRU(GRU_UNITS, return_sequences=True), name = 'answer_outputs')(document_emb)\n",
    "answer_tags = Dense(2, activation = 'softmax', name = 'answer_tags')(answer_outputs)\n",
    "\n",
    "encoder_input_mask = Input(shape=(MAX_ANSWER_SIZE, MAX_DOC_SIZE), name=\"encoder_input_mask\")\n",
    "encoder_inputs = Lambda(lambda x: K.batch_dot(x[0], x[1]), name=\"encoder_inputs\")([encoder_input_mask, answer_outputs])\n",
    "encoder_cell = GRU(2 * GRU_UNITS, name = 'encoder_cell')(encoder_inputs)\n",
    "\n",
    "decoder_inputs = Input(shape=(MAX_Q_SIZE,), name=\"decoder_inputs\")\n",
    "decoder_emb = embedding(decoder_inputs)\n",
    "decoder_emb.trainable = False\n",
    "decoder_cell = GRU(2 * GRU_UNITS, return_sequences = True, name = 'decoder_cell')\n",
    "decoder_states = decoder_cell(decoder_emb, initial_state = [encoder_cell])\n",
    "\n",
    "decoder_projection = Dense(VOCAB_SIZE, name = 'decoder_projection', activation = 'softmax', use_bias = False)\n",
    "decoder_outputs = decoder_projection(decoder_states)\n",
    "\n",
    "total_model = Model([document_tokens, decoder_inputs, encoder_input_mask], [answer_tags, decoder_outputs])\n",
    "plot_model(total_model, to_file='model.png',show_shapes=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#### INFERENCE MODEL ####\n",
    "\n",
    "decoder_inputs_dynamic = Input(shape=(1,), name=\"decoder_inputs_dynamic\")\n",
    "decoder_emb_dynamic = embedding(decoder_inputs_dynamic)\n",
    "decoder_init_state_dynamic = Input(shape=(2 * GRU_UNITS,), name = 'decoder_init_state_dynamic') #the embedding of the previous word\n",
    "decoder_states_dynamic = decoder_cell(decoder_emb_dynamic, initial_state = [decoder_init_state_dynamic])\n",
    "decoder_outputs_dynamic = decoder_projection(decoder_states_dynamic)\n",
    "\n",
    "answer_model = Model(document_tokens, [answer_tags])\n",
    "decoder_initial_state_model = Model([document_tokens, encoder_input_mask], [encoder_cell])\n",
    "question_model = Model([decoder_inputs_dynamic, decoder_init_state_dynamic], [decoder_outputs_dynamic, decoder_states_dynamic])\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "### LOAD MODEL WEIGHTS ####\n",
    "\n",
    "model_num = 1\n",
    "\n",
    "total_model.load_weights(os.path.join(RUN_FOLDER, 'weights/weights_{}.h5'.format(model_num)), by_name = True)\n",
    "question_model.load_weights(os.path.join(RUN_FOLDER, 'weights/weights_{}.h5'.format(model_num)), by_name = True)\n",
    "answer_model.load_weights(os.path.join(RUN_FOLDER, 'weights/weights_{}.h5'.format(model_num)), by_name = True)\n",
    "decoder_initial_state_model.load_weights(os.path.join(RUN_FOLDER, 'weights/weights_{}.h5'.format(model_num)), by_name = True)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# testing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Predicted answer probabilities\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 the 0.5\n",
      "1 winning 0.37\n",
      "2 goal 0.31\n",
      "3 was 0.46\n",
      "4 scored 0.26\n",
      "5 by 0.46\n",
      "6 23-year-old 0.46\n",
      "7 striker 0.51\n",
      "8 joe 0.57\n",
      "9 bloggs 0.5\n",
      "10 during 0.53\n",
      "11 the 0.48\n",
      "12 match 0.42\n",
      "13 between 0.62\n",
      "14 arsenal 0.51\n",
      "15 and 0.57\n",
      "16 barcelona 0.51\n",
      "17 . 0.65\n",
      "18 arsenal 0.49\n",
      "19 recently 0.62\n",
      "20 signed 0.55\n",
      "21 the 0.53\n",
      "22 striker 0.51\n",
      "23 for 0.47\n",
      "24 50 0.56\n",
      "25 million 0.64\n",
      "26 pounds 0.65\n",
      "27 . 0.67\n",
      "28 the 0.53\n",
      "29 next 0.56\n",
      "30 match 0.5\n",
      "31 is 0.74\n",
      "32 in 0.67\n",
      "33 two 0.52\n",
      "34 weeks 0.63\n",
      "35 time, 0.55\n",
      "36 on 0.55\n",
      "37 july 0.55\n",
      "38 31st 0.52\n",
      "39 2005 0.56\n",
      "40 . 0.61\n",
      "41  0.46\n"
     ]
    }
   ],
   "source": [
    "# answer placement predictions\n",
    "\n",
    "plt.figure(figsize=(15,5))\n",
    "idx = 0\n",
    "\n",
    "answer_preds = answer_model.predict(batch[\"document_tokens\"])\n",
    "\n",
    "print('Predicted answer probabilities')\n",
    "ax = plt.gca()\n",
    "ax.xaxis.grid(True)\n",
    "plt.plot(answer_preds[idx, :, 1])\n",
    "plt.show()\n",
    "\n",
    "for i in range(len(batch['document_words'][idx])):\n",
    "    print(i, batch['document_words'][idx][i], np.round(answer_preds[idx][i][1],2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['july', '31st', '2005']\n"
     ]
    }
   ],
   "source": [
    "# set chosen answer position\n",
    "\n",
    "start_answer = 37\n",
    "end_answer = 39\n",
    "\n",
    "print(batch['document_words'][idx][start_answer:(1+end_answer)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "answer_preds = answer_model.predict(batch[\"document_tokens\"])\n",
    "\n",
    "answers = [[0] * len(answer_preds[idx])]\n",
    "for i in range(start_answer, end_answer + 1):\n",
    "    answers[0][i] = 1\n",
    "\n",
    "answer_batch = expand_answers(batch, answers)\n",
    "\n",
    "next_decoder_init_state = decoder_initial_state_model.predict([answer_batch['document_tokens'][[idx]], answer_batch['answer_masks'][[idx]]])\n",
    "\n",
    "word_tokens = [START_TOKEN]\n",
    "questions = [look_up_token(START_TOKEN)]\n",
    "\n",
    "ended = False\n",
    "counter = 0\n",
    "\n",
    "while not ended:\n",
    "    \n",
    "    counter += 1\n",
    "\n",
    "    word_preds, next_decoder_init_state = question_model.predict([word_tokens, next_decoder_init_state])\n",
    "\n",
    "    next_decoder_init_state = np.squeeze(next_decoder_init_state, axis = 1)\n",
    "    word_tokens = np.argmax(word_preds, 2)[0]\n",
    "\n",
    "    questions.append(look_up_token(word_tokens[0]))\n",
    "\n",
    "    if word_tokens[0] == END_TOKEN or counter > 20 :\n",
    "        ended = True\n",
    "\n",
    "questions = ' '.join(questions)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'<START> fighter 57 largest outrage playing silent silent 37-year-old crude f1 long-range 84 administrator administrator mallorca basically kellogg met met strapped hackers'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "questions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "gdl",
   "language": "python",
   "name": "gdl"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
